/* 
    基础类型
    any number string boolean 
    数组 number[] Array<number> [stirng,number]
    枚举 enum
    void 用于标识方法返回值的类型，表示该方法没有返回值。
    null 表示对象值缺失
    undefined 用于初始化未定义的值
    never 	
    never 是其它类型（包括 null 和 undefined）的子类型，代表从不会出现的值。
*/

// Any类型
let x: any = 1 //数字类型
x = 'helle ts' // 字符串类型
x = false // 布尔类型

// 定义存储各种类型数据的数组时，示例代码如下：
let anyList: any[] = [1, '111sss', false]
anyList[1] = 'my name is ts'
console.log('anyList', anyList)

// null和undefined
let a: number = 1
// a = null // 编译错误
// a = undefined // 编译错误

// 修改后
let b: number | null | undefined

b = 1
b = null // 编译正确
b = undefined // 编译正确

// never类型 代表从不会出现的值。
// 这意味着声明为 never 类型的变量只能被 never 类型所赋值
// 在函数中它通常表现为抛出异常或无法执行到终止点（例如无限循环）
let Q: never
let W: number

// 编译错误 数字类型不能转为 never 类型
// Q = 123

// 运行正确 never 类型可以赋值给never类型
// Q = (() => {
//   throw new Error('exception')
// })()

// 运行正确 never 类型可以赋值给 数字类型
W = (() => {
  throw new Error('exception')
})()

// 返回值为 never 的函数可以是抛出异常的情况
function error(message: string): never {
  throw new Error(message)
}

// 返回值为 never 的函数可以是无法被执行到的终止点的情况
function loop(): never {
  while (true) {}
}
